package LimitedTimeGame.Day_0226;

/**
 * @author zxc
 * @date 2023/02/26 10:51
 **/

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 题目 ：两个数组的交集
 * 题目详述 ：
 * 给你两个整数数组nums1 和 nums2 ，请你以数组形式返回两数组的交集。
 * 返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致（如果出现次数不一致，则考虑取较小值）。可以不考虑输出结果的顺序。
 *
 * 提示：
 * 1 <= nums1.length, nums2.length <= 1000
 * 0 <= nums1[i], nums2[i] <= 1000
 *
 */
public class Intersect {
    /**
     * 思路 ：
     * （1）使用哈希表来存储nums1中所有元素 && 统计其中所有元素所出现的次数;
     * （2）遍历nums2数组，去获取是否该元素也存在于nums1数组中;
     *  ===> 即，通过遍历nums2数组中的所有元素，去判断是否存在于 存储了nums1数组元素的哈希表中;
     * @param nums1
     * @param nums2
     * @return
     */
    public int[] intersect(int[] nums1, int[] nums2) {
        HashMap<Integer , Integer> hashMap = new HashMap<>();
        List<Integer> list = new ArrayList<>();
        // 将nums1数组中所有元素 && 其中所有元素所出现的次数，都存储到hashmap中;
        for (int element : nums1) {
            hashMap.put(element , hashMap.getOrDefault(element , 0) + 1);
        }
        // 遍历nums2数组，来判断其中元素是否存在于hashmap中;
        for (int element : nums2) {
            // 若是nums2数组中某个元素存在于 nums1对应的hashmap中 && 当前元素出现次数 > 0的话
            // ===》则当前遍历的nums2数组中元素，是存在于nums1数组中的;
            // （即，是nums1和nums2数组的交集;）
            if(hashMap.containsKey(element) && hashMap.get(element) > 0){
                hashMap.put(element , hashMap.get(element) - 1);
                list.add(element);
            }
        }
        // 将集合list 转化为 数组int[]
        int[] result = new int[list.size()];
        int k = 0;
        for (Integer integer : list) {
            result[k++] = integer;
        }
        return result;
    }
}
